package controller;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ObjectWriter;


public abstract class Controller extends HttpServlet{

	/**
	 * 
	 */
	private static final long serialVersionUID = -6640937765444891331L;
	
	protected abstract void crearExperto();
	protected abstract Object procesarRequest(String metodo, HttpServletRequest request,HttpServletResponse response)throws Exception;
	
	
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		crearExperto();
		
		String metodo = obtenerMetodo(request.getRequestURI());
		Object respuesta = null;
		String respuestaJson = null;
		ObjectWriter jsonWriter = new ObjectMapper().writer().withDefaultPrettyPrinter();
		try{
			respuesta = procesarRequest(metodo, request, response);
			if(respuesta != null) {
				respuestaJson = jsonWriter.writeValueAsString(respuesta);
				response.getWriter().write(respuestaJson);
			} else {
				response.getWriter().write("");
			}
		}catch(Exception e){
			respuestaJson = jsonWriter.writeValueAsString(e);
			response.getWriter().write(respuestaJson);
		}
		
		

		
	}
	
	/**
	 * Parsea la uri para obtener el metodo que se debe ejecutar
	 * @param uri
	 * @return
	 */
	private String obtenerMetodo(String uri) {
		String[] elementos = uri.split("/");
		String metodo = null;
		if( elementos.length > 0) {
			metodo = elementos[elementos.length-1].toString();
		} 
		return metodo;
	}

}
